#ifndef TIMEWHEEL_H
#define TIMEWHEEL_H

#include <stdint.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// 定义时间轮最大连接数、槽位数量和超时时间
#define MAX_CONNECTIONS 1024
#define TIME_WHEEL_SIZE 30
#define TIMEOUT_SECONDS 30

// 定义时间戳类型为64位无符号整数
typedef uint64_t timestamp_t;

// 双向链表节点结构，用于存储连接信息
typedef struct node_ls {
    struct node_ls *prev;       // 指向前驱节点的指针
    struct node_ls *next;       // 指向后继节点的指针
    int netfd;                 // 网络连接文件描述符
    timestamp_t last_activate; // 最后活跃时间戳
    int slot_idx;              // 记录当前节点所在的槽位索引
} node_lt;

// 时间轮单个槽位的结构，包含双向链表的头和尾
typedef struct {
    node_lt* head;
    node_lt* tail;
} TimeWheelSlot;

// 时间轮整体结构
typedef struct {
    TimeWheelSlot slots[TIME_WHEEL_SIZE]; // 时间轮槽位数组
    node_lt* connections[MAX_CONNECTIONS]; // 连接ID到节点的映射表
    int current_slot;                     // 当前所在槽位索引
    timestamp_t start_time;               // 时间轮启动时间
    timestamp_t (*get_time_func)();       // 获取当前时间的函数指针
    void* time_arg;                       // 时间函数的参数（未使用）
} TimeWheel;

// 公共接口声明
timestamp_t get_current_time();           // 获取当前时间（毫秒）
void timewheel_init(TimeWheel* tw);       // 初始化时间轮
void timewheel_add_connection(TimeWheel* tw, int netfd); // 添加连接
void timewheel_activate_connection(TimeWheel* tw, int netfd); // 激活连接
void timewheel_remove_connection(TimeWheel* tw, int netfd); // 移除连接
void timewheel_tick(TimeWheel* tw, int *remove_netfd);       // 时间轮向前滚动一个槽位
void timewheel_cleanup(TimeWheel* tw);    // 清理时间轮资源


void print_current_time();
void print_active_connections(TimeWheel* tw);
#endif
